iT邦幫忙

2022 iThome 鐵人賽

DAY 2
0
自我挑戰組

數位影像處理系列 第 2

[Day 2] OpenCV介紹

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20220909/201523703gqLXV4BGP.png

OpenCV是個開源電腦視覺函示庫,由Intel公司發起並參與開發,目的為針對電腦視覺技術,建構開源的程式庫,以提供學術界或產業界使用。在第三方開發者的協助下,目前OpenCV以內建許多好用的功能模組。

本次安裝環境為 Windows 10 作業系統,以Python做為開發語言,因此需先建置好開發環境。
Python: 建議下載Anaconda,原因在於Anaconda以幫我們內建好許多的涵式庫,可以省去一些安裝作業,本身也有提供Spyder文字編輯器使用。也可以直接到Python網站下載環境,但讀者就需要自己額外去下載文字編輯器等等。筆者將以 Anaconda + Visual Studio Code 做為開發使用。

接著開啟Python Shell安裝OpenCV,輸入pip install opencv-python即可安裝完成。當使用時,可以用import cv2引入涵式庫。


1.讀取與顯示數位影像
既然要對影像進行處理,最基本的要先進行影像的輸出與輸入,OpenCV支援的影像檔案格式很多,包含:BMP、JPEG、GIF、PNG、TIFF等等。其中BMP檔案格式通常沒有採用壓縮技術,在讀寫過程中不會造成影像失真,因此本次將以BMP檔案格式實作。程式碼如下:
https://ithelp.ithome.com.tw/upload/images/20220909/20152370JNd8WOkUOl.png
程式碼說明:
第1行先載入numpy涵式庫,並簡化命名為np,接著第2行載入OpenCV涵式庫。

第4行使用imread涵式讀取影像檔案,以變數名稱img的Numpy陣列儲存於記憶體中(還記得上一章提到的,數位影像都是二維陣列的資料嗎)。

imread涵式中第一個參數為我們要讀取的檔案名稱,請注意!若程式和讀取的檔案在同一個資料夾,可以直接使用檔案名稱當作參數。若程式和讀取檔案在不同資料夾,就要像我一樣在檔案名稱前加入檔案的絕對路徑

第二個參數為影像的讀取方式,有以下幾種:
'-1':原始影像的型態讀取 ex:若為灰階影像,就以灰階方式讀取
'0':以灰階影像讀取
'1':以色彩影像讀取
'2':以任意位元深度的影像讀取
'4':讀取任意色彩的影像
我使用的Lena影像為色彩影像,因此會以色彩影像方式讀取。

第5行使用imshow建立視窗,視窗名稱為Example,並將數位影像顯示在視窗內,視窗的大小會隨著影像大小自動調整,結果如下圖:
https://ithelp.ithome.com.tw/upload/images/20220909/20152370UZ7H4wFZRe.png

第6行WaitKey等待使用者的鍵盤輸入,單位為毫秒(ms),例如1,000 代表等待1秒再關閉視窗,0則表示持續等待使用者輸入任意鑑後再關閉視窗。
第7行使用destroyAllWindows()關閉所有視窗,注意若沒有第6行的程式,就會造成圖片閃退。

那麼今天的OpenCV就初步到這告一個段落吧!下面有更進階的程式碼,若有興趣的話,不妨參考挑戰看看!
所有的程式碼都可在我的Github上找到喔!


若你時間充裕,且想要玩玩看更有趣的,就讓我們再來玩個更進階一點的吧!
為了幫助了解影像內容,可以用Python程式顯示像素資訊,包含數位影像中某像素的空間座標與對應的灰階強度,或是RGB值。下面我撰寫了一個小程式,這個程式可以根據你滑鼠鼠標在圖片中的位置,顯示影像的詳細資訊
程式碼如下:
https://ithelp.ithome.com.tw/upload/images/20220909/20152370OR9Ckuwpu3.png

上述程式碼看起來較為複雜,實際上可以分成兩個部分探討:
第6~14行的onMouse涵式以及第15~19行的主程式,由於onMouse並不會一開始就執行,所以執行順序是先從主程式->onMouse涵式->主程式結束,那麼就讓我們從第15行看起。

首先讀取lena的圖片,第16行的程式將輸出的視窗命名為lena。

第17行使用了內建的Callback涵式,當使用者在視窗內移動滑鼠,就會觸發事件(Event)並呼叫onMouse涵式。因此執行到此行,若滑鼠移動,就會進入第6行。

由於OpenCV視窗定義的x,y軸與數位影像的x,y軸相反,因此第7行先將x,y數值做交換。另外,OpenCV存取色彩影像時,其實是按照B、G、R的順序,因此第13行輸出的順序要反著來。

第8行判斷是否為色彩影像,因灰階影像為二維陣列,色彩影像為三維陣列。

由於我採用的是色彩影像,因此輸出的結果如下:https://ithelp.ithome.com.tw/upload/images/20220909/20152370HxuOAn767w.png

看到這裡,真是辛苦各位讀者了,若想更改程式碼可以到我的Github下載喔!那我們就明天見。


上一篇
[Day 1] 影像基礎
下一篇
[Day 3] 數位影像的取樣量化
系列文
數位影像處理30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言